from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment
from openpyxl.utils import get_column_letter
from 自动化流程测试.util.id_generator import generate_id_number
from 自动化流程测试.util.phone import generate_phone_number
from 自动化流程测试.util.bankCard import generate_simulated_bank_card_number
import random
import json
import os
from datetime import datetime

# 加载预定义的中文姓氏和名字库
with open("../util/chinese_names.json", "r", encoding="utf-8") as file:
    names_data = json.load(file)
    surnames = names_data["surnames"]
    given_names_male = names_data["given_names_male"]
    given_names_female = names_data["given_names_female"]


def generate_random_name():
    return f"{random.choice(surnames)}{random.choice(given_names_male if random.random() < 0.5 else given_names_female)}"


def generate_random_id_number():
    return generate_id_number()[0]


def generate_random_phone_number():
    return generate_phone_number()[0]


def generate_random_bank_card_number():
    return generate_simulated_bank_card_number()[0]

#金额设置小一点，免得余额不足
def generate_random_amount(min_amount=1000, max_amount=1000):
    return round(random.uniform(min_amount, max_amount), 2)


def create_settlement_template(type, dept_name,i):
    # 生成数据量
    num_rows = random.randint(1000, 1000)
    print('本次生成数据为' + str(num_rows) + '条数据')

    # 创建一个工作簿
    workbook = Workbook()
    # 选择一个表格 (默认为第一个)
    sheet = workbook.active
    sheet.merge_cells('A1:F1')
    # 合并H2到P2
    sheet.merge_cells('H2:P10')

    # 设置合并后单元格的对齐方式
    cell = sheet['A1']
    cell.alignment = Alignment(horizontal='center', vertical='center')
    sheet['H2'].alignment = Alignment(horizontal='center', vertical='center', wrapText=True)

    for col_idx in range(1, 7):  # A列的索引是1，F列的索引是6
        column_letter = get_column_letter(col_idx)
        sheet.column_dimensions[column_letter].width = 20.0  # 直接设置宽度

    # 设置A2到F9的单元格居中对齐
    for row in range(2, num_rows + 3):  # 行号从2到9
        for col in range(1, 7):  # 列号从1到6，A列是第1列，F列是第6列
            sheet.cell(row=row, column=col).alignment = Alignment(horizontal='center', vertical='center')

    # 设置第1到第5行的高度
    for row_idx in range(1, num_rows + 3):  # 第一行的索引是1，第五行的索引是5
        sheet.row_dimensions[row_idx].height = 50  # 直接设置高度

    # 创建字体对象，设置加粗和颜色
    bold_font = Font(name='Calibri', bold=True)  # 加粗字体
    red_bold_font = Font(name='Calibri', bold=True, color='FF0000')  # 加粗字体，颜色为红色

    # 创建填充对象，设置背景色
    fill = PatternFill(start_color='FFFF00', end_color='FFFF00', fill_type='solid')  # 背景颜色为黄色

    # A1赋予字体加粗
    sheet['A1'].font = bold_font

    # A2:E2字体加粗
    coordinates = ['A2', 'B2', 'C2', 'D2', 'E2', 'F2']
    for coord in coordinates:
        cell = sheet[coord]
        cell.font = bold_font

    # E2字体加粗，背景黄色
    sheet['H2'].font = red_bold_font
    sheet['H2'].fill = fill

    sheet['A1'] = '结算单明细'
    sheet['A2'] = '自由职业者姓名'
    sheet['B2'] = '自由职业者身份证号'
    sheet['C2'] = '自由职业者手机号'
    sheet['D2'] = '银行卡号/支付宝帐号'

    # 获取当前时间并格式化为字符串
    now = datetime.now()
    timestamp_str = now.strftime("%Y%m%d%H%M%S%f")[:-3]

    if type == '1':
        sheet['E2'] = '结算金额(元)（结算金额不含服务费）'
        if i != None:
            filename = f'{str(i)}.xlsx'
        else:
            filename = f'{dept_name}(不含服务费){timestamp_str}.xlsx'
    else:
        sheet['E2'] = '结算金额(元)（结算金额含服务费）'
        if i != None:
            filename = f'{str(i)}.xlsx'
        else:
            filename = f'{dept_name}(不含服务费){timestamp_str}.xlsx'

    sheet['F2'] = '备注'
    sheet[
        'H2'] = '注意事项：\n1、收款银行过于小众可能会支付失败（如：村镇银行等），请联系自由职业者更换收款账户\n 2、自由职业者收款账户为支付宝的，目前仅支持企业银行账户为平安-支付宝、网商银行进行支付，其余银行账户可能会支付失败，支付前请核对企业账户类型 \n3、前5列必填，请勿修改/删除/增加；备注列非必填且仅支持中文、大小写英文字母、逗号、句号、数字、中划线、下划线，其他字符暂不支持 \n4、自由职业者发放金额超过单笔最大限额时，系统会自动拆分成多笔进行发放(单笔最大限额：平安银行50000，平安-微信20000，建设银行50000) \n5、修改文件名时请勿修改/删除后缀名'

    print(dept_name + '企业开始创建结算文件')
    # 初始化工作表
    populate_data(sheet, num_rows)
    # 保存Excel文件
    saved_path = save_and_return_path(workbook, filename, dept_name)
    return saved_path


def save_and_return_path(workbook, filename, dept_name):
    # 获取当前工作目录
    current_directory = os.getcwd()

    settleFile = os.path.join(current_directory, '结算单文件夹')

    dept_folder_path = os.path.join(settleFile, dept_name)

    # 检查部门文件夹是否存在，不存在则创建
    if not os.path.exists(dept_folder_path):
        os.makedirs(dept_folder_path)

    full_output_path = os.path.join(dept_folder_path, filename)
    # 保存Excel文件
    workbook.save(full_output_path)

    return full_output_path


def populate_data(sheet, num_rows):
    # 批量填充数据
    # 批量填充数据
    # 自动生成姓名并填充
    product_names = [generate_random_name() for _ in range(num_rows)]
    for row, product_name in enumerate(product_names, start=3):  # 从第3行开始
        sheet.cell(row=row, column=1).value = product_name

    # 自动填充身份证号
    id_numbers = [generate_random_id_number() for _ in range(num_rows)]
    for row, id_number in enumerate(id_numbers, start=3):  # 从第3行开始
        sheet.cell(row=row, column=2).value = id_number

    # 自动填充手机号
    phone_numbers = [generate_random_phone_number() for _ in range(num_rows)]
    for row, phone_number in enumerate(phone_numbers, start=3):  # 从第3行开始
        sheet.cell(row=row, column=3).value = phone_number

    # 自动填充银行卡号
    bank_card_numbers = [generate_random_bank_card_number() for _ in range(num_rows)]
    for row, bank_card_number in enumerate(bank_card_numbers, start=3):  # 从第3行开始
        sheet.cell(row=row, column=4).value = bank_card_number

    # 随机生成金额并填充
    amounts = [generate_random_amount() for _ in range(num_rows)]
    for row, amount in enumerate(amounts, start=3):  # 从第3行开始
        sheet.cell(row=row, column=5).value = amount

# create_settlement_template('1', '测试部门')